﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;

namespace SisCRA.Database
{
    public class ActivityDAL
    {
        #region -Constants-

        private const string TABLE = "ATIVIDADE";
        private const string INSERT_ACTIVITY = "INSERT INTO T_ATIVIDADE (DC_NOME, DC_DESCRICAO, DN_PESO, FK_DISCIPLINA_ID) VALUES (@NOME, @DESCRICAO, @PESO, @DISCIPLINA_ID)";
        private const string UPDATE_ACTIVITY = "UPDATE T_ATIVIDADE SET DC_NOME = @NOME, DC_DESCRICAO = @DESCRICAO, DN_PESO = @PESO, FK_DISCIPLINA_ID = @DISCIPLINA_ID WHERE PK_ATIVIDADE_ID = @ID";
        private const string GET_ACTIVITY_BY_ID = "SELECT A.PK_ATIVIDADE_ID AS ID, A.DC_NOME AS NOME, A.DC_DESCRICAO AS DESCRICAO, A.DN_PESO AS PESO, D.DC_CODIGO AS DISCIPLINA FROM T_ATIVIDADE A, T_DISCIPLINA D WHERE A.FK_DISCIPLINA_ID = D.PK_DISCIPLINA_ID AND A.PK_ATIVIDADE_ID = @ID";
        private const string GET_ACTIVITY_BY_NAME = "SELECT A.PK_ATIVIDADE_ID AS ID, A.DC_NOME AS NOME, A.DC_DESCRICAO AS DESCRICAO, A.DN_PESO AS PESO, D.DC_CODIGO AS DISCIPLINA FROM T_ATIVIDADE A, T_DISCIPLINA D WHERE A.FK_DISCIPLINA_ID = D.PK_DISCIPLINA_ID AND A.FK_DISCIPLINA_ID = @DISCIPLINA_ID AND A.DC_NOME LIKE @NOME";
        private const string GET_ALL_BY_DISCIPLINE = "SELECT A.PK_ATIVIDADE_ID AS ID, A.DC_NOME AS NOME, A.DC_DESCRICAO AS DESCRICAO, A.DN_PESO AS PESO, D.DC_CODIGO AS DISCIPLINA FROM T_ATIVIDADE A, T_DISCIPLINA D WHERE A.FK_DISCIPLINA_ID = D.PK_DISCIPLINA_ID AND A.FK_DISCIPLINA_ID = @DISCIPLINA_ID";

        #endregion

        #region -Private Attributes-

        MySqlConnection conn;
        MySqlCommand cmd;
        MySqlDataAdapter da;

        #endregion

        #region -Public Methods-

        /// <summary>
        /// Método que insere uma atividade no banco de dados.
        /// </summary>
        /// <param name="name">Nome da atividade</param>
        /// <param name="description">Descrição da atividade</param>
        /// <param name="percentage">Peso da atividade</param>
        /// <param name="disciplineId">Id da disciplina dessa atividade</param>
        public void InsertActivity(string name, string description, double percentage, int disciplineId)
        {
            try
            {
                conn = Connection.Instance.Conn;
                conn.Open();
                cmd = new MySqlCommand(INSERT_ACTIVITY, conn);
                cmd.Parameters.AddWithValue("@NOME", name);
                cmd.Parameters.AddWithValue("@DESCRICAO", description);
                cmd.Parameters.AddWithValue("@PESO", percentage);
                cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        /// <summary>
        /// Método que atualiza uma atividade no banco de dados.
        /// </summary>
        /// <param name="id">Id da atividade</param>
        /// <param name="name">Nome da atividade</param>
        /// <param name="description">Descrição da atividade</param>
        /// <param name="percentage">Peso da atividade</param>
        /// <param name="disciplineId">Id da disciplina dessa atividade</param>
        public void UpdateActivity(int id, string name, string description, double percentage, int disciplineId)
        {
            try
            {
                conn = Connection.Instance.Conn;
                conn.Open();
                cmd = new MySqlCommand(UPDATE_ACTIVITY, conn);
                cmd.Parameters.AddWithValue("@NOME", name);
                cmd.Parameters.AddWithValue("@DESCRICAO", description);
                cmd.Parameters.AddWithValue("@PESO", percentage);
                cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                cmd.Parameters.AddWithValue("@ID", id);
                cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        /// <summary>
        /// Método que busca uma atividade pelo Id.
        /// </summary>
        /// <param name="id">Id da atividade</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetActivityById(int id)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                conn = Connection.Instance.Conn;
                conn.Open();
                cmd = new MySqlCommand(GET_ACTIVITY_BY_ID, conn);
                cmd.Parameters.AddWithValue("@ID", id);
                da = new MySqlDataAdapter();
                da.SelectCommand = cmd;
                da.Fill(dt);

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                da.Dispose();
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        /// <summary>
        /// Método que busca as atividades de uma disciplina pelo nome.
        /// </summary>
        /// <param name="name">Nome da atividade</param>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetActivityByName(string name, int disciplineId)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                conn = Connection.Instance.Conn;
                conn.Open();
                cmd = new MySqlCommand(GET_ACTIVITY_BY_NAME, conn);
                cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                cmd.Parameters.AddWithValue("@NOME", "%" + name + "%");
                da = new MySqlDataAdapter();
                da.SelectCommand = cmd;
                da.Fill(dt);

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                da.Dispose();
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        /// <summary>
        /// Método que busca todas as atividades de uma disciplina.
        /// </summary>
        /// <param name="disciplineId">Id da disciplina</param>
        /// <returns>DataTable contendo a busca realizada</returns>
        public DataTable GetAllByDiscipline(int disciplineId)
        {
            DataTable dt = new DataTable(TABLE);

            try
            {
                conn = Connection.Instance.Conn;
                conn.Open();
                cmd = new MySqlCommand(GET_ALL_BY_DISCIPLINE, conn);
                cmd.Parameters.AddWithValue("@DISCIPLINA_ID", disciplineId);
                da = new MySqlDataAdapter();
                da.SelectCommand = cmd;
                da.Fill(dt);

                return dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                da.Dispose();
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        #endregion
    }
}
